/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package solicitacaoCompra;

import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import util.ErroAcessoRepositorioException;
import util.HibernateUtil;


/**
 *
 * @author amedeiros
 */
public class RepositorioSolicitacaoCompra {
    
    /**
     * Mensagem que indica erro de acesso ao banco de dados.
     */
    private static final String MSG_ERRO_ACESSO_BD = "Erro de acesso ao banco de dados";

    public RepositorioSolicitacaoCompra() {}
    
    /**
     * Método que ira cadastrar / atualizar o objeto Solicitacao compra
     * 
     * @param objSolicitacaoCompra
     * @throws ErroAcessoRepositorioException 
     */
    public void cadastrarAtualizar(SolicitacaoCompra objSolicitacaoCompra) throws ErroAcessoRepositorioException{
        Session s = null;
        Transaction t = null;
        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();
            s.saveOrUpdate(objSolicitacaoCompra);
            t.commit();
        } catch (Exception e) {
            t.rollback();
            throw new ErroAcessoRepositorioException(e.getMessage(), null, 1);
        }
    }
    
    /**
     * Método que ira procurar na base um objeto solicitação compra pelo seu id
     * 
     * @param idSolicitacaoCompra
     * @return  SolicitacaoCompra
     * @throws ErroAcessoRepositorioException
     */
    public SolicitacaoCompra procurar(int idSolicitacaoCompra) throws ErroAcessoRepositorioException{
        SolicitacaoCompra objSolicitacaoCompra = null;
        
        Session s = null;
        Transaction t = null;
        
        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();
            
            // Procurando na base
            objSolicitacaoCompra = (SolicitacaoCompra) s.get(SolicitacaoCompra.class, idSolicitacaoCompra);
            
            t.commit();
        } catch (Exception e) {
            t.rollback();
            throw new ErroAcessoRepositorioException(e.getMessage(), null, 1);
        }
        
        return objSolicitacaoCompra;
    }
    
    /**
     * Método que ira verificar a existencia na base um objeto solicitação compra pelo seu id
     * 
     * @param idSolicitacaoCompra
     * @return  boolean
     */
    public boolean existe(int idSolicitacaoCompra){
        SolicitacaoCompra objSolicitacaoCompra = null;
        
        Session s = null;
        Transaction t = null;
        
        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();
            
            // Procurando na base
            objSolicitacaoCompra = (SolicitacaoCompra) s.get(SolicitacaoCompra.class, idSolicitacaoCompra);
            
            t.commit();
        } catch (Exception e) {}
        
        return (objSolicitacaoCompra != null);
    }
    
    /**
     * método que ira listar os objetos na base
     * @param strComplemento
     * @return  List<SolicitacaoCompra>
     */
    public List<SolicitacaoCompra> listar(String strComplemento){
        List<SolicitacaoCompra> listSolicitacaoCompra = null;
        
        Session s = null;
        Transaction t = null;
        
        // Se o complemento for nulo eu adiciono um valor vazio
        strComplemento = (strComplemento == null) ? "" : strComplemento;
        
        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();
            // criando a query a ser rodada
            Query q = s.createQuery("from SolicitacaoCompra WHERE id_solicitacao_compra IS NOT NULL " + strComplemento);
            
            // Listando na base
            listSolicitacaoCompra = q.list();
            
            t.commit();
        } catch (Exception e) {}
        
        return listSolicitacaoCompra;
    }
    
    /**
     * método que ira listar as solicitações ativas e que não houveram compras para as mesmas na base
     * @param strComplemento
     * @return  List<SolicitacaoCompra>
     */
    public List<SolicitacaoCompra> listarAtivasNaoComppradas(){
        String strComplemento = " AND status_solicitacao_compra = true AND flag_comprado = false ORDER BY id_solicitacao_compra, data_solicitacao";
        
        return this.listar(strComplemento);
    }
    
    /**
     * método que ira listar os objetos na base
     * @param strComplemento
     * @return  List<SolicitacaoCompra>
     */
    public List<SolicitacaoCompra> listarPordescricaoProduto(int intDescricaoProduto){
        List<SolicitacaoCompra> listSolicitacaoCompra = null;
        
        Session s = null;
        Transaction t = null;
        
        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();
            // criando a query a ser rodada
            Query q = s.createQuery("from SolicitacaoCompra WHERE status_solicitacao_compra = true  AND id_descricao_produto = :id_descricao_produto ORDER BY id_solicitacao_compra, data_solicitacao");
            
            q.setParameter("id_descricao_produto", intDescricaoProduto);
            
            // Listando na base
            listSolicitacaoCompra = q.list();
            
            t.commit();
        } catch (Exception e) {}
        
        return listSolicitacaoCompra;
    }
    
    /**
     * 
     * @param idSolicitacaoCompra 
     */
    public void remover(int idSolicitacaoCompra)throws Exception{
        if(this.existe(idSolicitacaoCompra)){
            try {
                // recuperando o objeto na base
                SolicitacaoCompra objSolicitacaoCompra = this.procurar(idSolicitacaoCompra);
                
                // setando seu status pra false
                objSolicitacaoCompra.setStatusSolicitacao(false);
                
                // atualizando o objeto na base
                this.cadastrarAtualizar(objSolicitacaoCompra);
                
            } catch (Exception e) {}
        }else
            throw new Exception("Solicitação Não Cadastrada!");
    }
}
